#include<iostream>

using namespace std ;

const int maxn = 10 ;

//全排列就是画一棵树，递归的去走每一条路径 ， path就是记录路径的
int n ; //共有 n 个数
int  path[maxn] ;
bool st[maxn]; //记录哪些点已经被访问过了 , true表示被用过了

void dfs(int x) {
    if(x == n)  {
        //代表路径已经填满了，把路径输出
        for (int i = 0; i < n; ++i) {
            printf("%d " , path[i]);
        }
        printf("\n");
    }

    for (int i = 1 ; i <= n ; i++) {
        //遍历每一个数，看下哪个还没用过
        if(st[i] == false) {
            //没被用过
            path[x] = i ;
            st[i] = true ;
            dfs(x + 1); //每一次递归都是往路径中填一位数
            //回复现场
            st[i] = false ;
        }
    }
}

int main() {

    scanf("%d" , &n);

    dfs(0) ;

    return 0 ;
}